import axios from 'axios'
import { Message } from 'element-ui'
import store from '../store'
import { getToken } from 'utils/auth'

// 创建axios实例
const service = axios.create({
  baseURL: process.env.BASE_API, // api的base_url
  timeout: 15000 // 请求超时时间
})

// request拦截器
service.interceptors.request.use(
  config => {
    if (store.getters.token) {
      config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
    }
    return config
  },
  error => {
    // Do something with request error
    console.log(error) // for debug
    Promise.reject(error)
  }
)

// respone拦截器
service.interceptors.response.use(
  response => {
    // 判断一下响应中是否有 token，如果有就直接使用此 token 替换掉本地的 token
    let token = response.headers.authorization
    if (token) {
      token = token.slice(7)
      // 如果 header 中存在 token，那么触发 SetToken 方法，替换本地的 token
      store.dispatch('SetToken', token).then(() => {
        return response.data
      })
    }
    return response.data
  },
  error => {
    const data = error.response.data
    const status = error.response.status
    switch (status) {
      // 如果响应中的 http code 为 401，那么则此用户可能 token 失效了之类的，我会触发 logout 方法，清除本地的数据并将用户重定向至登录页面
      case 401:
        Message({
          message: data.message,
          type: 'error',
          duration: 5 * 1000
        })
        store.dispatch('LogOut')
        break
      case 422:
        let errors = ''
        for (const error of Object.values(data.errors)) {
          errors += error + '.  '
        }
        Message({
          message: errors,
          type: 'error',
          duration: 5 * 1000
        })
        break
      default:
        Message({
          message: data.message,
          type: 'error',
          duration: 5 * 1000
        })
        break
    }
    return Promise.reject(error)
  }
)

export default service
